'''
函数逻辑：
计算风险等级（合并答案，得分转换）
'''

import openpyxl
import re
from openpyxl.utils import get_column_letter, column_index_from_string
import pandas as pd
from datetime import datetime

#根据分值和合并的答案来计算风险值
def calculate_risk(score:str,answer:str,age:str,xueqing:str):
    if score == '17~23 分' and xueqing == '是':
        return   8
    elif score == '12~16 分'and xueqing == '是':
        return  9
    elif score == '0~11 分'and xueqing == '是':
        return 10
    else:
        # 去掉字符串中的括号，得到每组数据

        # 使用正则表达式切割字符串，并去除左右括号
        data = re.findall(r'\(([^)]*)\)', answer)

        print('切割数组为：',data)
        # 定义结果数组
        results2_6 = []
        results7_9 = []
        attachment = ''
        # 遍历每组数据
        for index, group in enumerate(data):
            # 分割每组数据，得到数字和内容部分
            parts = group.split(":")
            num = int(parts[0])
            content = parts[1]

            # 判断条件，如果内容为数字:@，则结果为False；否则为True
            if content == "@":
                result = False
            else:
                result = True
                # 根据索引判断将结果添加到数组中
            if index <= 4:
                results2_6.append(result)
            elif index > 4 and index <8:
                results7_9.append(result)
            else:
                attachment = result

        # 打印最终结果数组
        print('结果数组results2_6：',results2_6)
        print('results7_9：', results7_9)
        #下面根据results的计算结果来写逻辑返回不同的风险等级结果。
        if age == "40以下":
            if all(not x for x in results2_6) and  all(not x for x in results7_9):
                    return 3
            elif (any(results2_6)) or (any(results7_9)):
                return 4
        else: #40岁以上
            if any(results2_6):
            # 检查第7到第9个元素是否全部为False
                if all(not x for x in results7_9) and attachment:
                # 如果满足条件，将返回为1
                  return 1
                elif any(results7_9)and attachment:
                  return 2
                elif (not attachment): return 7
            elif all(not x for x in results2_6):
                if all(not x for x in results7_9):
                    return 5
                elif any(results7_9):
                    return 6



#将结果数据进行统计，得到统计结果
def analysis_data(excel_file:str):
# 读取 Excel 文件
  df = pd.read_excel(excel_file)
  # 判断风险等级是否为高风险（1, 2, 8）
  df['IsHighRisk'] = df.loc[:, '风险等级':'风险等级'].isin([1, 2, 8])
  # 提取提交时间的日期部分
  df['SubmitDate'] = pd.to_datetime(df['提交时间'], format='%Y-%m-%d %H:%M:%S').dt.date
  # 统计每家医院的数据
  given_date  = datetime.today().date()
  hospital_stats = df.groupby('医院').agg(
    TotalData=('医院', 'count'),
    NewDataToday=('SubmitDate', lambda x: (x == given_date).sum()),
    TotalHighRisk=('IsHighRisk', 'sum'),
    NewHighRiskToday=('SubmitDate', lambda x: ((x == given_date) & df['IsHighRisk']).sum())
  ).reset_index()
  # 将结果转换为数组
  result_array = hospital_stats.values.tolist()
  print('打印统计结果：',result_array)# 打印结果数组
  return result_array
#将统计结果写入到excel中，然后标颜色美化一下
def state_data(data: str,out_file_path:str):
    df = pd.DataFrame(data, columns=['医院名称', '问卷总数', '今日新增问卷数', '高风险总数', '今日新增高风险数'])

    # 新建 Excel 文件

    with pd.ExcelWriter(out_file_path, engine='xlsxwriter') as writer:
    # 将 DataFrame 写入 Excel 文件
      df.to_excel(writer, sheet_name='Sheet1', index=False)

    # 获取 ExcelWriter 对象中的 workbook 和 worksheet
      workbook = writer.book
      worksheet = writer.sheets['Sheet1']

    # 添加标题行
      header_format = workbook.add_format({'bold': True, 'text_wrap': True, 'valign': 'vcenter', 'align': 'center'})
      for col_num, value in enumerate(df.columns.values):
        worksheet.write(0, col_num, value, header_format)

    # 设置自动筛选

      worksheet.autofilter(0, 0, df.shape[0], (df.shape[1] - 1))

    # 设置所有列的宽度为20
      for col_num, value in enumerate(df.columns.values):
        worksheet.set_column(col_num, col_num, width=20)

    # 获取 DataFrame 中的实际数据范围
      data_range = f"A2:{chr(ord('A') + df.shape[1] - 1)}{df.shape[0] + 1}"

    # 添加交替的行背景色
      alternating_color_format1 = workbook.add_format(
        {'text_wrap': True, 'valign': 'vcenter', 'align': 'center', 'bg_color': 'white'})
      alternating_color_format2 = workbook.add_format(
        {'text_wrap': True, 'valign': 'vcenter', 'align': 'center', 'bg_color': '#D6EAF8'})  # 浅蓝色
    # 设置背景色的范围为行 1 到 df.shape[0]
    # 遍历每一行，设置交替行的背景色
      for row_num in range(1, df.shape[0] + 1):
        if row_num % 2 == 0:
            for col_num in range(df.shape[1]):
                worksheet.write(row_num, col_num, df.iloc[row_num - 1, col_num], alternating_color_format2)
        else:
            for col_num in range(df.shape[1]):
                worksheet.write(row_num, col_num, df.iloc[row_num - 1, col_num], alternating_color_format1)



# 打开本地Excel文档
workbook = openpyxl.load_workbook('湖北省健康人群胃癌筛查工程受检者自评表.xlsx')

# 选择工作表，假设工作表名为Sheet1
sheet = workbook['湖北省健康人群胃癌筛查工程受检者自评表']

# 初始化两个变量来存储AK列和AM列的数据，仅用于调试
ak_data = [] #取值score
am_data = []  #取值合并答案

# 从第2行开始依次读取AK列和AM列的数据
for row_num, row in enumerate(sheet.iter_rows(min_row=2, values_only=True), start=2):
    print('row_num', row_num)
    ak_value = row[38-2]  # AK列是第38列，索引从0开始
    am_value = row[40-2]  # AM列是第40列，索引从0开始
    xueqing_vale = row[6 - 1]  # G列取值年龄
    age_vale = row[7-1] #G列取值年龄
    print('取值：score', ak_value)
    print('取值：合并答案', am_value)
    print('取值：age', xueqing_vale)
    print('取值：age', age_vale)
    risk = calculate_risk(ak_value,am_value,age_vale,xueqing_vale)
    print("第",row_num,"行","的风险为：",risk)

    #--------将risk写回到excel表格中的BG列
    sheet.cell(row=row_num, column=59, value=risk)

    ak_data.append(ak_value)
    am_data.append(am_value)

#调试代码
    #if row_num >=6:
    #    break

#给风险等级列添加表头
sheet.cell(row=1, column=59, value="风险等级")

# 输出读取到的数据
#print("AK 列数据:", ak_data)
#print("AM 列数据:", am_data)
# 删除 AN 到 AW 列的数据（列数是从 1 开始的）
start_col = column_index_from_string('AN')

print("start_col 数据:", start_col)
#删除多余的数据情况1，情况2......
sheet.delete_cols(start_col, 10)

# 设置所有列的宽度为固定宽度（例如，设置为10）
fixed_width = 20
for column in sheet.columns:
    sheet.column_dimensions[column[0].column_letter].width = fixed_width
workbook.save("final.xlsx")
# 关闭工作簿
workbook.close()

data = analysis_data("final.xlsx")
state_data(data,"final_state.xlsx")
